import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
import QtQuick.Controls.Styles 1.1
import "./components"

import ColetorPCP 1.0

ApplicationWindow {
    id: app
    title: qsTr("Controle Nutricional - PCP - Coleta de Dados")
    width: 1024
    height: 740
    visible: true
    color: "#F5F5F5"
    visibility: Window.FullScreen

    property string plataforma: "DESKTOP"
    property string departamento

    property SelecaoProduto selecaoProduto: null
    property SelecaoEtapa selecaoEtapa: null
    property Pesagem pesagem: null
    property bool carregandoDados: false

    AppSkin {
        id: appSkin;
    }

    ColetorPCP {
        id: coletor_pcp
        onNetworkError: app.mostrar_erro_rede(mensagem);
        onNetworkSuccess: app.testar_bd();

        onDatabaseConnectionError:  app.mostrar_erro_conexao_bd(mensagem);
        onDatabaseConnectionSuccess: app.recarregar_dados();

        onDatabaseError: {carregandoDados = false; app.mostrar_erro_carregar_dados(mensagem);}
        onDataLoaded: {carregandoDados = false; app.start();}
    }

    Component.onCompleted: {
        testar_rede();
    }

    function testar_rede() {
        overlay.visible = true;
        overlay.text = "Aguarde, verificando a rede...";
        overlay.text_visible = true;

        coletor_pcp.testar_rede();
    }

    function testar_bd() {
        overlay.visible = true;
        overlay.text = "Aguarde, verificando a conexão\ncom o banco de dados...";
        overlay.text_visible = true;

        coletor_pcp.testar_bd();
    }

    function recarregar_dados() {
        if(!carregandoDados) {
            carregandoDados = true;
            app.plataforma = coletor_pcp.get_plataforma();

            stackView.clear();
            stackView.visible = false;

            if (pesagem != null) {
                pesagem.destroy();
                pesagem = null;
            }

            if (selecaoProduto != null) {
                selecaoProduto.destroy();
                selecaoProduto = null;
            }

            if (selecaoEtapa != null) {
                selecaoEtapa.destroy();
                selecaoEtapa = null;
            }

            overlay.opacity = 0.8;
            overlay.visible = true;
            overlay.text = "Aguarde, carregando os dados...";
            overlay.text_visible = true;

            coletor_pcp.load_all_data();
        }
    }

    function start() {
        if(coletor_pcp.interface_type()=="PADRAO") {
            appSkin.backgroundColor = "white";

            appSkin.buttonTextColor = "black";
            appSkin.buttonColor = "white";
            appSkin.buttonPressedColor = "";

            appSkin.paginatorButtonTextColor = "black";
            appSkin.paginatorButtonColor = "white"
            appSkin.paginatorButtonPressedColor = ""

            appSkin.verticalSeparatorColor = "";
            appSkin.horizontalSeparatorColor = "";
        } else if(coletor_pcp.interface_type()=="FUNDO DESTACADO") {
            appSkin.backgroundColor = "";

            appSkin.buttonTextColor = "black";
            appSkin.buttonColor = "white";
            appSkin.buttonPressedColor = "gray";

            appSkin.paginatorButtonTextColor = "black";
            appSkin.paginatorButtonColor = "white"
            appSkin.paginatorButtonPressedColor = "gray"

            appSkin.verticalSeparatorColor = "white";
            appSkin.horizontalSeparatorColor = "white";
        } else if(coletor_pcp.interface_type()=="BOTOES DESTACADOS") {
            appSkin.backgroundColor = "#F5F5F5";

            appSkin.buttonTextColor = "white";
            appSkin.buttonColor = "";
            appSkin.buttonPressedColor = "gray";

            appSkin.paginatorButtonTextColor = "white";
            appSkin.paginatorButtonColor = ""
            appSkin.paginatorButtonPressedColor = "gray"

            appSkin.verticalSeparatorColor = "";
            appSkin.horizontalSeparatorColor = "";
        } else {
            appSkin.backgroundColor = "white";

            appSkin.buttonTextColor = "black";
            appSkin.buttonColor = "white";
            appSkin.buttonPressedColor = "";

            appSkin.paginatorButtonTextColor = "black";
            appSkin.paginatorButtonColor = "white"
            appSkin.paginatorButtonPressedColor = ""

            appSkin.verticalSeparatorColor = "";
            appSkin.horizontalSeparatorColor = "";
        }

        if (pesagem == null) {
            // Instancia a página de pesagem
            var componentPesagem = Qt.createComponent("Pesagem.qml");
            pesagem = componentPesagem.createObject(stackView);
        }

        if (selecaoProduto == null) {
            // Instancia a página de seleção de produto
            var componentSelecaoProduto = Qt.createComponent("SelecaoProduto.qml");
            selecaoProduto = componentSelecaoProduto.createObject(stackView);
        }

        if (selecaoEtapa == null) {
            // Instancia a página de seleção de etapa
            var componentSelecaoEtapa = Qt.createComponent("SelecaoEtapa.qml");
            selecaoEtapa = componentSelecaoEtapa.createObject(stackView);
        }

        app.departamento = coletor_pcp.get_departamento();

        // Cria os botões das panelas e deixa em memória
        pesagem.carregarDados();

        // Cria os botões dos produtos e deixa em memória
        selecaoProduto.carregarDados();

        // Cria os botões das etapas e deixa em memória
        selecaoEtapa.carregarDados();

        stackView.push({item: selecaoEtapa, immediate: true, destroyOnPop: false});
        stackView.visible = true;
        selecaoEtapa.iniciarSelecaoEtapa();

        overlay.visible = false;
    }

    function quit() {
        Qt.quit();
    }

    function sair(button, dialog) {
        overlay.opacity = 1.0;
        dialog.hide();
        overlay.text_visible = true;

        if (app.plataforma == "EMBARCADO") {
            coletor_pcp.desligar();
        } else {
            coletor_pcp.on_exit();
            quit();
        }
    }

    function close_dialog(button, dialog) {
        dialog.hide();
        overlay.text = "";
        overlay.visible = false;
    }

    function confirmar_desligamento() {
        overlay.visible = true;
        overlay.text = "Desligando...";
        overlay.text_visible = false;
        modal_dialog.show("Tem certeza que deseja desligar o equipamento?",
                          [{"text": "Sim", "width": 150, "action": sair},
                           {"text": "Não", "width": 150, "action": close_dialog}]);
    }

    function mostrar_erro_rede(mensagem) {
        overlay.visible = true;
        overlay.text_visible = false;
        modal_dialog.show(mensagem, [{"text": "Tentar Novamente", "width": 250, "action": testar_rede_novamente}]);
    }

    function testar_rede_novamente(button, dialog) {
        dialog.hide();
        testar_rede();
    }

    function mostrar_erro_conexao_bd(mensagem) {
        overlay.visible = true;
        overlay.text_visible = false;
        modal_dialog.show(mensagem, [{"text": "Tentar Novamente", "width": 250, "action": testar_bd_novamente}]);
    }

    function testar_bd_novamente(button, dialog) {
        dialog.hide();
        testar_bd(true);
    }

    function mostrar_erro_carregar_dados(mensagem) {
        overlay.visible = true;
        overlay.text_visible = false;
        modal_dialog.show(mensagem, [{"text": "Tentar Novamente", "width": 250, "action": tentar_carregar_dados_novamente}]);
    }

    function tentar_carregar_dados_novamente(button, dialog) {
        dialog.hide();
        recarregar_dados(true);
    }

    StackView {
        id: stackView
        anchors.top: header2.bottom
        anchors.topMargin: 0
        anchors.bottom: header.top
        anchors.bottomMargin: 0
    }

    Header2 {
        id: header2
        objectName: "header2"
    }

    Header {
        id: header
        objectName: "header"
    }

    Rectangle {
        id: overlay
        anchors.fill: parent
        visible: true
        color: "#000000"
        opacity: 0.8
        property alias text: overlay_text.text
        property alias text_visible: overlay_text.visible

        MouseArea{
            id: overlayMouseArea
            anchors.fill: parent
        }

        Text {
            id: overlay_text
            color: "#ffffff"
            text: qsTr("Inicializando...")
            font.bold: true
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.verticalCenter: parent.verticalCenter
            font.pixelSize: parent.width * 0.05
        }

        Dialog {
            id: modal_dialog
        }
    }
}
